package ar.pegasus.clasificador.util;


/**
 * Esta clase se encarga de procesar un String para obtener sus tokens conformantes.
 * 
 * @author oarias
 *
 */
public class NombreScanner {

	public static final int FINALIZADO = 0;
	public static final int CARACTER = 1;
	public static final int NUMERO = 2;
	public static final int ESPECIAL = 3;
	
	private String stringOriginal;
	private String stringConsumible;
	
	public NombreScanner(String tokenList){
		setStringOriginal(tokenList);
		setStringConsumible(tokenList);
	}

	public void setStringOriginal(String stringOriginal) {
		this.stringOriginal = stringOriginal;
	}

	public String getStringOriginal() {
		return stringOriginal;
	}

	private void setStringConsumible(String tokenList) {
		stringConsumible = tokenList;
	}
	
	/**
	 * Se encarga de consumir el String original y retornar el proximo {@code NombreToken} 
	 * 
	 * @return token extraido
	 */
	public NombreToken getToken() {
		int tipo=FINALIZADO;
		int inicio,largo;
		boolean Ok;
		String token;
		char lista[];
		inicio = 0; // 1;
		// borro los blancos del string
		stringConsumible = stringConsumible.trim();
		largo = stringConsumible.length();
		if(largo == 0)
			return new NombreToken("", FINALIZADO);
		lista = stringConsumible.toCharArray();
		token = String.valueOf(lista[inicio]);
		// verifico que el primer caracter no sea especial. Si lo es
		// lo retorno
		if ( isSpecial(lista[0]) ){
			stringConsumible = stringConsumible.substring(1);
			return new NombreToken(token, ESPECIAL);
		}
		 
		if (Character.isDigit(lista[0])){
			inicio++;
			Ok = true;
			while (( inicio < largo ) && Ok ){ 
				Ok = ( Character.isDigit(lista[inicio] ));
				if( Ok){
					token = token+lista[inicio];
					inicio++;
				}
			}
			tipo = NUMERO;
		}else{
			inicio++;
			Ok = true;
			while (( inicio < largo ) && Ok ){ 
				Ok = ( Character.isLetter(lista[inicio] ));
				if(Ok){
					token = token+lista[inicio];
					inicio++;
				}
			}
			tipo = CARACTER;
		}	
		if(inicio >= largo)
			stringConsumible = "";
		else
			stringConsumible = stringConsumible.substring(inicio);
		return new NombreToken(token, tipo);		
	}

	/**
	 * Determina si un caracter es especial segun la nomenclatura Secretaria Electoral
	 * 
	 * @param caracter caracter a analizar.
	 * @return true si el caracter es especial
	 */
	private boolean isSpecial(char caracter) {
		return (caracter == '.' || caracter == '/' || caracter == '°' || caracter == ' ' || caracter =='-') ;
	}

	public void putInFront(NombreToken token) {
		stringConsumible = token.getToken() + stringConsumible; 
	}

	public void clear() {
		setStringOriginal(null);
		setStringConsumible(null);
	}
}
